单片机keil C中的data、bdata、idata、xdata、hdata、pdata、code解释

8051系列有片内、片外程序存储器,片内、片外数据存储器,片内程序存储器还分直接寻址区和间接寻址类型,分别对应code、data、xdata、idata以及根据51系列特点而设定的pdata类型,使用不同的存储器,将使程序执行效率不同,在编写C51程序时,最好指定变量的存储类型,这样将有利于提高程序执行效率 ( 此问题将在后面专门讲述)。与ANSI-C稍有不同,它只分SAMLL、COMPACT、LARGE模式,各种不同的模式对应不同的实际硬件系统,也将有不同的编译结果。

在51系列中data,idata,xdata,pdata的区别:

data:固定指前面0x00-0x7f的128个RAM,可以用acc直接读写的,速度最快,生成的代码也最小。

idata:固定指前面0x00-0xff的256个RAM,其中前128和data的128完全相同,只是因为访问的方式不同。idata是用类似C中的指针方式访问的。

xdata:外部扩展RAM,一般指外部0x0000-0xffff空间,用DPTR访问。

一、存储类型与存储区关系
data —>   可寻址片内ram
bdata —>   可位寻址的片内ram
idata —>  可寻址片内ram,允许访问全部内部ram
pdata —> 分页寻址片外ram (MOVX @R0) (256 BYTE/页)
xdata —> 可寻址片外ram (64k 地址范围FFFFH)
code —> 程序存储区 (64k 地址范围),对应MOVC @DPTR

二、指针类型和存储区的关系

1、对变量进行声明时可以指定变量的存储类型如:
uchar data x和data uchar x相等价都是在内ram区分配一个字节的变量。

2、对于指针变量的声明,因涉及到指针变量本身的存储位置和指针所指向的存储区位置不同而进行相应的

uchar xdata * data pstr

是指在内ram区分配一个指针变量(““号后的data关键字的作用),而且这个指针本身指向xdata区(““前xdata关键字的作用),

注意以下定义的区别:

1
2
3
4
5
unsigned char * xdata pWriteTagId;//定义指针,此指针存放在外部ram中,此指针指向的数据类型为unsigned char。

unsigned char xdata *pWriteTagId;//定义指针,此指针存放在内部ram中,此指针指向的数据存放在外部ram中,类型为unsigned char。

unsigned char xdata * xdata pWriteTagId;//定义指针,此指针存放在外部ram中,此指针指向的数据也存放在外部ram中,类型为unsigned char。

对于外部ram的使用,只要硬件把相应的引脚连接好之后,软件不需要进行任何设置,直接使用xdata进行访问即可。